<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>正则表达式</title>
</head>
<body>
<!--

-->
</body>
<script>
    /*
    * 概念：用于匹配字符串中字符组合的方式。在JavaScript中，正则表达式也是对象，通常用来查找、替换那些符合正则表达式的文本，许多语言都支持正则表达式
    * 使用场景：
    *      匹配：验证表单: 用户名表单中只能输入英文字母、数字或者下划线，昵称输入框中可以输入中文(匹配)
    *           比如用户名: /^[a-z0-9_-]{3,16}$/
    *      替换：过滤掉页面中的一些敏感词(替换)，或者从字符串中获取我们想要的特定部分（提取）等
    *      提取：字符串中提取我们想要的部分
    * 语法：
    *      1.定义正则表达式语法：
    *         const 变量名 = /表达式/ ———— 表达式不需要写引号。即使是字符串也不写
    *      2.检查正则表达式语法：
    *        （1） 检测规则.test(被检测的字符串)
    *             如果检测到规则就返回true 否则就返回false
    *        （2） 检测规则.exec(被检测的字符串)——————不常用
    *             如果检测到规则就返回一个数组，字段如下
    *                 找到的字段 、 找到位置的索引号 、被检测的字符串
    *             如果检测不到规则就返回null
    * */

    /*
    * 元字符
    *   概念：一类具有特殊含义的字符，可以极大地提高编程的灵活性和匹配功能
    *      比如，规定用户只能输入英文26个字母，普通字符的话abcdefghijklm 但是换成元字符写法 [a-z]
    *   好处：
    *       极大地提高了灵活性和强大的匹配功能
    *   分类：
    *       边界符（表示位置、开头和结尾、必须用什么开头、用什么结尾）
    *               ^表示开头 、 $表示结尾
    *       量词（表示某个模式重复的次数）
    *           * 重复0次或更多次
    *           + 重复1次或更多次
    *           ? 重复0次或1次
    *           {n} 重复n次
    *           {n,} 重复n次或更多次
    *           {n,m} 重复n次到m次
    *           （这些用大括号括起来的数据不能有空格分开）
    *       字符类（比如\d 表示 0-9）
    *           (1) []匹配字符集合
    *               后面字符串只要包含abc中任意一个字符，都返回true
    *               在[]外面加^ ———— ^[]表示以[]里面的字符的任意一个或者多个开头
    *               在[]里面加^ ———— [^ ]表示以[]里面的字符取反 ———— [^a-z]匹配除了小写字母以外的字符
    *
    *           (2) 预定义: 指的是某些常见模式的简写方式
    *               预定类:
    *                   \d 匹配0-9之间的任一数字，相当于[0-9]
    *                   \D 匹配所有0-9以外的字符，相当于[^0-9]
    *                   \w 匹配任意的字母、数字和下划线，相当于[A-Za-z0-9_]
    *                   \W 匹配除所有字母、数字和下划线以外的字符，相当于 [^A-Za-z0-9_]
    *                   \s 匹配空格字符(包括换行符、制表符、空格符等)相当于[\t\r\n\v\f]
    *                   \S 匹配非空格的字符，相当于[^\t\r\n\v\f]
    *           (3) 修饰符: 修饰符约束正则执行的某些细节行为，如是否区分大小写、是否支持多行匹配等
    *               语法: /表达式/修饰符
    *                    /表达式/i ———— i是单词ignore的缩写，正则匹配时字母不区分大小写
    *                    /表达式/g ———— g是单词global的缩写，匹配所有满足正则表达式的结果
    *                    新字符串 = 字符串.replace(/正则表达式/ , '替换的文本') ———— 在字符串中找到/正则表达式/，并将其替换成替换的文本
    *                    （字符串只能保存在新字符串中，字符串不能自己保存自己）
    * */
    const str = '我们在学习前端，希望学习前端能高薪就业'
    // 正则表达式使用
    // 1.定义规则
        const reg = /前端/
    // 2.检查匹配
    if (reg.test(str)) console.log('我成功了')
    else console.log('我失败了')

    // 元字符的使用
    // 1.边界符
    console.log(/哈/.test('我是哈的'))
    console.log(/^哈/.test('哈')) // 定义了一个规则，必须以"哈"开头
    console.log(/^哈/.test('二哈'))
    console.log(/哈$/.test('二哈')) // 定义了一个规则，必须以"哈"结束
    console.log(/哈$/.test('哈二'))
    console.log(/^哈$/.test('哈')) // 定义了一个规则，必须匹配"哈"——————精确匹配，一模一样
    console.log(/^哈$/.test('哈哈'))

    // 2.量词
    console.log(/^哈*$/.test('哈哈')) // 定义了一个规则，内部只能有"哈",且"哈"的出现次数要大于等于0次
    console.log(/^哈+$/.test('哈哈')) // 定义了一个规则，内部只能有"哈",且"哈"的出现次数要大于等于1次
    console.log(/^哈?$/.test('哈哈')) // 定义了一个规则，内部只能有"哈",且"哈"的出现次数要为0或1次
    console.log(/^哈{4}$/.test('哈哈哈哈')) // 定义了一个规则，内部只能有"哈",且"哈"的出现次数要为4次
    console.log(/^哈{4,}$/.test('哈哈哈哈')) // 定义了一个规则，内部只能有"哈",且"哈"的出现次数要为4次或更多次
    console.log(/^哈{4,8}$/.test('哈哈哈哈哈哈')) // 定义了一个规则，内部只能有"哈",且"哈"的出现次数要为4-8

    // 3.字符类
    console.log(/[abc]/.test('andy')) // 后面字符串只包含 abc 的 任意一个 就行,当然包含多个也可以
    console.log(/^[abc]$/.test('andy')) // 精确匹配，必须是 a 或 b 或 c
    console.log(/^[abc]$/.test('a'))
    console.log(/^[a-z]$/.test('k')) // 连字符表示范围的精确匹配
    console.log(/^[a-zA-Z0-9]$/.test('K')) // 精确匹配，表示只能输入1个 大小写字母或者数字
    console.log(/^[a-zA-Z0-9]$/.test('ds'))
    console.log(/^[1-9][0-9]{4,}$/.test('2315404869')) // QQ号必须以1-9的数字开头，并且至少达到5位0-9数字填充
    console.log(/^[1-9][0-9]{4,}$/.test('0315404869')) // QQ号必须以0的数字开头，并且至少达到5位0-9数字填充
    console.log(/^[a-zA-Z0-9-_]{6,16}$/.test('huang2315404869')) // 常见的用户名要求————英文字母（大小写）、下划线、短横线组成，并且用户名长度为6-16位

    // 4.修饰符
    console.log(/^java$/i.test('JAVA')) // 不区分大小写
    const str1 = 'java是一门编程语言，学完Java工资很高'
    console.log(str1)
    const str2 = str1.replace(/java/i , '前端') // 只能替换一个
    const str3 = str1.replace(/java/ig , '前端') // 全部替换
    console.log(str2)
    console.log(str3)
</script>
</html>